package xx.services;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;

import xx.services.util.Constants;

@Path(Constants.RESTFUL_ROOT_PATH + "/code")
public class CodeRest extends Passport
{
    public CodeRest(@Context
    HttpServletRequest request)
    {
        super(request);
        // TODO Auto-generated constructor stub
    }

    @GET
    public void get(@Context
    HttpServletResponse response) throws IOException
    {
        initNumCharCode(response);
    }

    private void initNumCharCode(HttpServletResponse response) throws IOException
    {
        // 验证码图片的宽度。
        int width = 60;
        // 验证码图片的高度。
        int height = 20;
        // 验证码字符个数
        int codeCount = 4;

        // 字体高度
        int fontHeight = 22;

        char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N',
                'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6',
                '7', '8', '9'};

        String[] fontName = {"宋体", "Arial", "方正姚体", "黑体"};

        int[] fontStyle = {Font.ITALIC, Font.LAYOUT_LEFT_TO_RIGHT, Font.PLAIN};
        // 定义图像buffer
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();

        // 创建一个随机数生成器类
        Random random = new Random();

        // 将图像填充为白色
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);

        // 画边框。
        g.setColor(Color.BLACK);
        g.drawRect(0, 0, width - 1, height - 1);

        // 随机产生160条干扰线，使图象中的认证码不易被其它程序探测到。
        // g.setColor(getRandColor(160, 200));
        for (int i = 0; i < 160; i++)
        {
            g.setColor(getRandColor(180, 220));
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x, y, x + xl, y + yl);
        }

        // sRand用于保存随机产生的验证码，以便用户登录后进行验证
        String sRand = "";
        // 随机产生codeCount数字的验证码。
        for (int i = 0; i < codeCount; i++)
        {
            // 创建字体，字体的大小应该根据图片的高度来定。
            String name = fontName[random.nextInt(fontName.length)];
            Font font = new Font(name, fontStyle[random.nextInt(fontStyle.length)], fontHeight);

            // 设置字体。
            g.setFont(font);

            // 得到随机产生的验证码数字。
            String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
            sRand += strRand;

            // 用随机产生的颜色将验证码绘制到图像中。
            g.setColor(getRandColor(0, 120));
            g.drawString(strRand, (fontHeight - 7) * i + 2, fontHeight - 5);
        }

        // 将认证码存入SESSION
        session.setAttribute(Constants.VERIFY_CODE, sRand);

        // 图象生效
        g.dispose();

        // 输出图象到页面
        ImageIO.write(image, "JPEG", response.getOutputStream());
    }

    private Color getRandColor(int fc, int bc)
    {
        // 给定范围获得随机颜色
        Random random = new Random();
        if (fc > 255)
        {
            fc = 255;
        }
        if (bc > 255)
        {
            bc = 255;
        }
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }
}
